home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / FPUSUPPO.D < prev    next >
Encoding:
Modula Definition  |  1990-11-27  |  6.4 KB  |  140 lines

  1. DEFINITION MODULE FPUSupport;
  2.  
  3. (*
  4.  * Hilfsfunktionen für den Einsatz eines Mathe-Koprozessors (FPU) sowohl
  5.  * im Atari ST/STE als auch im Atari TT.
  6.  * Es bietet eine Funktion zum nachträglichen Initialisieren der FPU
  7.  * sowie Modula-Versionen von FSAVE/FRESTORE (incl. FMOVEM).
  8.  *
  9.  * Unbedingt beachten, wenn eine FPU in Accessories oder Coroutinen
  10.  * eingesetzt werden soll!
  11.  *
  12.  * Wenn Sie allerdings keine Programme mit den speziellen FPU-Direktiven
  13.  * (siehe F-Direktive) oder mit einer FPU-Shell erzeugen (eine FPU-Shell
  14.  * wird mit den speziellen Modulen aus den Ordnern ST_FPU bzw. TT_FPU
  15.  * erzeugt und zeigt "IEEE" als Real-Format in den Umgebungsinformationen
  16.  * an), brauchen Sie dieses Modul nicht weiter beachten.
  17.  *
  18.  * Die FPU hat eigene Register, die - entgegen den Registern der CPU
  19.  * (Hauptprozessor, z.B. 68000 im ST) - nicht automatisch in Coroutinen
  20.  * oder Task-Umschaltungen (bei Accessories) gerettet werden. Sollten
  21.  * Sie also ein Modula-Programm erzeugen, das mit Reals rechnet und
  22.  * dazu die FPU benutzt, sollten Sie beachten, daß ggf. noch andere
  23.  * Programme gleichtzeitig die FPU benutzen könnten und Sie oder die
  24.  * anderen Programme die Register der FPU ggf. unkontrolliert verändern.
  25.  *
  26.  * Accessories (auch residente Programme)
  27.  * --------------------------------------
  28.  *   Eine laufende Hauptapplikation darf nach Definition von Atari davon
  29.  * ausgehen, daß ihr die FPU alleine gehört. Sprich: Niemand darf ihr
  30.  * reinpfuschen und ihr die FPU-Register verändern. Wär' ja auch noch
  31.  * schöner.
  32.  *   So empfiehlt Atari dann auch, in Accessories die FPU gar nicht
  33.  * zu benutzen, damit dies nicht passiert. Es sei denn, das Accessory
  34.  * sorgt dafür, daß die Hauoptanwendung nix merkt. Aber das fand man
  35.  * bei Atari schon sehr abwegig. Nichtsdestotrotz bieten wir hier genau
  36.  * die richtige Lösung. 'Save-' und 'RestoreContext' sind nämlich genau
  37.  * dazu fähig. Sie brauchen in einem Accessory, das die FPU benutzen
  38.  * soll, lediglich beim Aufruf des Acc. den FPU-Status der Hauptappl.
  39.  * zu retten und den eigenen wiederherstellen und bei Verlassen des
  40.  * Acc. das gleiche umgekehrt zu tun.
  41.  *   Das ganze sieht dann etwa so aus:
  42.  *
  43.  * MODULE Acc;
  44.  *  ...
  45.  * VAR accFPU, applFPU: FPUContext; (* Puffer-Zeiger für die Register *)
  46.  *  ...
  47.  * BEGIN
  48.  *    ... Initialisierung des ACC ...
  49.  *   NewContext (accFPU);
  50.  *   NewContext (applFPU);
  51.  *   SaveContext (applFPU);   (* Vor jedem Restore- erstmal ein SaveContext! *)
  52.  *    ... Nun die Event-Schleife:
  53.  *   LOOP
  54.  *     SaveContext (accFPU);      (* eigene FPU-Register sichern *)
  55.  *     RestoreContext (applFPU);  (* FPU-Register der Hauptappl. laden *)
  56.  *     MessageEvent (...);        (* nun kommen die anderen dran *)
  57.  *     SaveContext (applFPU);     (* FPU-Register der Hauptappl. sichern *)
  58.  *     RestoreContext (accFPU);   (* eigene FPU-Register zurückladen *)
  59.  *     ...
  60.  *   END
  61.  *
  62.  * Anmerkung zum obigen Beispiel:
  63.  *   Der erste Aufruf von 'SaveContext (applFPU)' ist notwendig, da sonst ein
  64.  * undefinierter Status beim folgenden Aufruf von 'RestoreContext (applFPU)'
  65.  * vorläge, was zu einem Laufzeitfehler führen würde.
  66.  *
  67.  * Coroutinen
  68.  * ----------
  69.  *   Hier müssen Sie beachten, daß bei einem TRANSFER oder IOTRANSFER
  70.  * die Register der FPU nicht mit umgeschaltet werden. Verwendet mehr
  71.  * als eine Coroutine die FPU, müssen Sie die Register jeder Coroutine
  72.  * vor ihrem Verlassen retten (mit 'SaveContext') und bei Rückkehr
  73.  * wiederherstellen (mit 'RestoreContext'). Rahmen Sie also sicherheits-
  74.  * halber immer die TRANSFER-Aufrufe der Coroutinen, die mit Reals rechnen,
  75.  * mit 'Save-' und 'RestoreContext' ein. Natürlich muß es nicht dort
  76.  * geschehen - nur spätestens vor der Benutzung von Reals bei der
  77.  * nächsten Coroutine.
  78.  *)
  79.  
  80.  
  81. PROCEDURE FPUInit;
  82.  (*
  83.   * Inititialisiert die FPU so, daß alle Exceptions (Laufzeitfehler) gemeldet
  84.   * werden, die durch Megamax-Modula-Routinen auftreten können. Dies sind:
  85.   * Overflow, Div By Zero, Operand Error, Signalling NAN, Bcc/Scc On Unordered.
  86.   *
  87.   * Ein Modula-Programm, das eine FPU benutzt, macht diese Initialisierung
  88.   * zu Beginn selbständig. Ein expliziter Funktionsaufruf ist nur dann nötig,
  89.   * wenn dieser Status von anderen Routinen zerstört worden sein kann (s.o.).
  90.   * Das ist aber in der Regel - wenn 'SaveContext' und 'RestoreContext' richtig
  91.   * eingesetzt werden - nicht der Fall.
  92.   *)
  93.  
  94. TYPE FPUContext;
  95.  
  96. PROCEDURE NewContext     (VAR context: FPUContext);
  97. PROCEDURE DisposeContext (VAR context: FPUContext);
  98.  (*
  99.   * Reservieren einen Speicherbereich mit Storage.ALLOCATE, der als
  100.   * Context-Puffer für 'SaveContext' und 'RestoreContext' dient.
  101.   * Wenn der Speicher nicht mehr reicht (ca. 300 Byte), wird ein
  102.   * Laufzeitfehler (MOSGlobals.OutOfMemory) ausgelöst.
  103.   *
  104.   * Damit es bei Accessories keine Probleme gibt, müssen evtl. Aufrufe
  105.   * von 'NewContext' schon während der Initialisierung des ACCs
  106.   * geschehen, dürfen also nicht mehr gemacht werden, wenn das ACC
  107.   * durch einen Event aufgerufen wird.
  108.   *)
  109.  
  110. PROCEDURE SaveContext    (context: FPUContext);
  111. PROCEDURE RestoreContext (context: FPUContext);
  112.  (*
  113.   * 'SaveContext' rettet den augenblicklichen Status der FPU incl. aller
  114.   * Register, 'RestoreContext' stellt ihn wieder her.
  115.   *
  116.   * Entsprechen den FPU-Instruktionen FSAVE/FRESTORE incl. FMOVEM zum Retten
  117.   * aller Register (FP0-FP7/FPCR/FPSR/FPIAR).
  118.   *)
  119.  
  120. PROCEDURE AcknowledgeException (context: FPUContext);
  121.  (*
  122.   * Hiermit kann, anstatt die FPU ganz zurückzusetzen, bei einer FPU-Exception
  123.   * das Bit 27 der BIU-Flags gesetzt werden. Dazu muß im Exception-Handler
  124.   * zuerst der Context mit 'SaveContext' gerettet werden, dann kann diese
  125.   * Funktion aufgerufen werden. Danach kann der Context zurückgeladen und die
  126.   * Exception beendet werden (z.B. durch Rückgabe von FALSE bei einem Exc-
  127.   * Handler, der über das Exceps-Modul angemeldet wurde).
  128.   * Wird dieser Aufruf bei einer 68881 unterlassen, führt das zwar zu keinen
  129.   * Fehlern, bei einer 68882 (im Atari TT) würde das aber sehr wohl zu
  130.   * Problemen führen!
  131.   * Deshalb: Wer die FPU-Exceptions selbst abfängt, muß entweder diese
  132.   * Prozedur oder "FPUInit" bei Auftreten einer Exception aufrufen!
  133.   *
  134.   * Wenn Sie das Modul "EasyExceptions", "ErrBase" o. "HdlError" verwenden
  135.   * oder wenn Sie einen der Error-Treiber einbinden, brauchen Sie sich aber
  136.   * keine Gedanken hierüber machen.
  137.   *)
  138.  
  139. END FPUSupport.
  140.